Go 的 IO 接口及概念
Go 的 IO 库整理
io
基本的 IO 接口,属于底层接口定义库,其作用是是定义一些基本接口和一些基本常量,并对这些接口的作用给出说明,常见的接口有Reader、Writer等。一般用这个库只是为了调用它的一些常量,比如 io.EOF
。
ioutil
方便的 IO 操作函数集,包含在 io 目录下,它的主要作用是作为一个工具包,里面有一些比较实用的函数,比如 ReadAll(从某个源读取数据)、ReadFile(读取文件内容)、WriteFile(将数据写入文件)、ReadDir(获取目录)
fmt
格式化 IO,实现格式化 I/O,类似 C 语言中的 printf 和 scanf
os
库主要是跟操作系统打交道,所以文件操作基本都会跟 os 库挂钩,比如创建文件、打开一个文件等。这个库往往会和 ioutil 库、bufio 库等配合使用
bufio
可以理解为在 io 库上再封装一层,加上了缓存功能。它可以和 ioutil 结合使用
Linux 的文件权限
fmt.Println(os.FileMode(0660)) //-rw-rw----
开头使用 0
的表示这是一个 8 进制的数字
这边先整理,0-7 每个数字权限的意义。
0 没有任何权限
1 可以执行
2 可以写
3 可以写、可以执行
4 可以读
5 可以读、可以执行
6 可以读、可以写
7 可以读、可以写、可以执行
所以这个 0660 代表
- 档案所有者可以有读写的权限
- 群组用户可以有读写的权限
- 其他用户没有任何权限
基本的 IO 接口
io 包为 I/O 原语提供了基本的接口。它主要包装了这些原语的已有实现。比较常用的接口有三个,分别是 Reader,Writer 和 Close。
// Read方法会接收一个字节数组p,并将读取到的数据存进该数组,最后返回读取的字节数n。
// 注意n不一定等于读取的数据长度,比如字节数组p的容量太小,n会等于数组的长度
type Reader interface {
Read(p []byte) (n int, err error)
}
// Write 方法同样接收一个字节数组p,并将接收的数据保存至文件或者标准输出等,返回的n表示写入的数据长度。
// 当n不等于len(p)时,返回一个错误。
type Writer interface {
Write(p []byte) (n int, err error)
}
// 关闭操作
type Closer interface {
Close() error
}
这个 Read 的用法(因为 io 库都是接口,所以这里拿 bufio 的为例):
reader := bufio.NewReader(conn)
var buf [128]byte
n, err := reader.Read(buf[:])
Reference
Go 中文网 - 输入输出 (Input/Output) os. OpenFile 的第三个参数 perm FileMode IO 操作库那么多,我咋选?谈谈对 Go IO 读写的困惑